
function sum(...params){
    console.log( `${this.name}正在完成加法运算` );
    if( params.length > 0 ) {
        return params.reduce( (accumulator,current) => accumulator + current );
    }
}

let total = sum( 1 , 2 , 3 , 4 );
console.log( total );

let who = { name: '小姜同学' }
total = sum.apply( who , [ 1 , 2 , 3 , 4 ] );
console.log( total );

console.log( '- - - - - - - - - - - - - - - - - - - -' );

let stu = {
    name: '姜玉芝' ,
    multiply( a , b ){
        console.log( `${this.name}正在完成乘法运算`);
        return a * b ;
    }
}

console.log( stu.multiply( 3 , 4 ) );

console.log( stu.multiply.apply( who , [ 3 , 4 ] ) );

// 总结:
// 1、除箭头函数外，其它函数都可以通过 apply 方式来调用并设置函数内部的 this
//    functionReference.apply( thisArg , ...params );
//    对于箭头函数来说，可以使用 apply 来调用，但不能更改箭头函数内部的 this
// 2、Function.prototype.apply( thisArg , paramArray ) 可以调用除箭头函数外的其它函数

// MDN:
// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

let divide = (a,b) => {
    console.log( this );
    return a /b ;
};

console.log( divide.apply( {name:'猪悟能'} , [ 6 , 2 ] ) );